package com.example.concurrent.chapter16;

/**
 * @author Create By Liuqz
 * @date 2018/11/26 14:22
 */
public class FlightSecurityTest {

    //旅客线程
    static class Passenagers extends Thread {
        //机场安检类
        private final FlightSecurity flightSecurity;

        //旅客的身份证
        private final String idCard;

        //旅客的登机牌
        private final String boardingPass;

        //构造旅客时传入身份证,登机牌以及机场安检类
        public Passenagers(FlightSecurity flightSecurity, String idCard, String boardingPass) {
            this.flightSecurity = flightSecurity;
            this.idCard = idCard;
            this.boardingPass = boardingPass;
        }

        @Override
        public void run() {
            while (true) {
                //旅客不断地过安检
                flightSecurity.pass(boardingPass, idCard);
            }
        }
    }

    /**
     * 在不对pass方法进行同步操作时,程序会报错,出现数据不一致的问题
     *
     * 被同步方法修饰的pass方法不会再出现检查出错的情况
     * check方法是在pass方法中执行的,pass方法已经保证了同一时刻只有一个线程去访问共享资源
     * 因此check方法不用增加同步,toString方法同理
     *
     * 何时适合使用Single Thread Execution(同一时刻只有一个线程去访问共享资源)
     * 1.多线程资源访问的时候,被synchronized同步的方法总是排他性的
     * 2.多个线程对某个类的状态发生改变的时候,比如FlightSecurity的登机牌以及身份证
     *
     * Java中的线程安全的类是指 多个线程对某个类的实例同时进行操作时,不会引起数据不一致的问题
     * 反之则是线程非安全的类
     *
     * @param args
     */
    public static void main(String[] args) {
        final FlightSecurity flightSecurity = new FlightSecurity();
        new Passenagers(flightSecurity, "A123456", "A123456").start();
        new Passenagers(flightSecurity, "B123456", "B123456").start();
        new Passenagers(flightSecurity, "C123456", "C123456").start();
    }
}
